// 文件上传
// express
var express = require('express');
// express - 实例化路由
var router = express.Router();
// 中间件 - 验证用户信息
var middle = require('./../middle/auth');
// 中间件 - 上传文件
// 详解见此博文: https://blog.csdn.net/B11050729/article/details/129351341
// 安装multer包
var multer = require('multer');
// --------------------------- 引用包 ---------------------------------//
// system: 文件
var fs = require('fs');
// system: 路径
const path = require('path');
// 日期库: https://dayjs.fenxianglu.cn/category/#node-js
const dayjs = require('dayjs');
// 工具类: 快速返回值
const back = require('./../utils/back');
// 数据库
const db = require('./../db/db');

// --------------------------- API 方法 ---------------------------------//
const media = {};
// 上传文件
media.upload = async (req, res, next) => {
  // console.log(req);
  // 文件按日期划分文件夹
  const date = dayjs().format('YYYYMMDD');
  const upload = multer({
    // 存储路径
    dest: `./public/upload/${date}`,
  }).single('file');

  // 处理文件
  upload(req, res, async (err) => {
    const params = req.body;
    // 上传文件
    if (err instanceof multer.MulterError) {
      res.send(back.ERR(back.ERROR_PARAM, '文件不能为空'));
      return;
    }

   // 文件对象
    const file = req.file;
    // console.log(file);

    // 从中间件取值
    const { user_type, user_id, user_name } = req.userInfo;
    // 本地存储路径
    const savePath = file.path + path.extname(file.originalname);
    // 文件名称，处理乱码问题
    const fileName = Buffer.from(file.originalname, 'latin1').toString('utf8');
    // 数据库存储路径
    const filePath = savePath.replace(/^public/, '');
    // 上传时间
    const upload_time = dayjs().format('YYYY-MM-DD HH:mm:ss');
    // 文件大小
    const size = (file.size / 1024).toFixed(2);
    

    // 写入记录
    const state = await db.query(
      `insert into media(user_type, user_id, user_name, source, name, size, path, upload_time) values (?,?,?,?,?,?,?,?)`,
      [
        user_type,
        user_id,
        user_name,
        params.source,
        fileName,
        size,
        filePath,
        upload_time,
      ]
    );
    if (state === false) {
      // 删除临时文件
      fs.unlinkSync(file.path);
      res.send(back.ERR(back.ERROR_DB, '资源记录写入失败'));
      return;
    }

    // 存储时重命名
    fs.renameSync(file.path, savePath);

    // 返回值
    res.send(back.Key(filePath));
  });
};

// --------------------------- API 路由 ---------------------------------//
// 上传图片
router.post('/upload', middle.baseAuth, media.upload);
// router.post('/upload', media.upload);

module.exports = router;
